<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
<script>

/*
作用域：
2.函数作用域：
  - 調用函數時創建函數作用域，函數執行結束後，函數作用域銷毀
  - 每調用一次就會創建一個新的函數作用域，他們之間時互相獨立的
  - 在函數作用域中可以訪問到全局作用域中的變量
    - 函數作用域中的變量，不能訪問到全局作用域中的變量
    - 當全局作用域和函數作用域中都有相同名稱的變量時，會優先使用函數作用域中的變量
    - 在函數中如果想使用全局變量，需要使用  window.變量名  來訪問
*/

//創建一個變量
var a="我是全局作用域中的a";

function fun(){
  var a= "我是fun函數的a";
  var b= 20;
  console.log("fun函數調用："+a);  //依次往上一級搜索，直到找到為止

  //在fun中在創建一個函數
  function fun2(){
    console.log("fun2函數調用："+a);  //依次往上一級搜索，直到找到為止
     console.log("fun2函數調用："+window.a); //訪問全局作用域中的a  
  }
  fun2();
}

fun();


/*
 *在函數作用域也有聲明提前的特性
    - 使用var關鍵字聲明的變量，會在函數中所有的代碼執行之前被聲明
    - 函數聲明也會在函數中所有的代碼執行之前執行
 */
function fun3(){
  var a= 33;   //在這裡聲明一個變量a，那麼控制台函數中就可以訪問到a了
  console.log("fun3函數調用："+a);
  var a= 35;  //如果在這裡寫的話，那麼由於聲明提前的原因,控制台報undefined 

  function fun4(){
    alert("我是fun4函數！");
  }
  fun4();  
}
fun3();




</script>



</head>
<body>
  
</body>
</html>